The embodiments disclosed within this specification relate to analyzing computer programs to identify errors. Analysis tools are commonly used in software development to evaluate the behavior of computer programs. A typical analysis tool can be considered to be a member of one of two different categories of analysis tools. These two categories are static analysis and runtime (or dynamic) analysis. In general, runtime analysis refers to the practice of understanding computer program behavior using data collected during execution of a computer program. To this end, runtime analysis can detect a wide variety of errors and generates relatively few false positive reports compared to static analysis. Runtime analysis, however, does not evaluate the entirety of a computer program. Rather, runtime analysis typically analyzes only those portions of the computer program that are actually executed during testing.
Static analysis refers to the practice of analyzing a computer program without actually executing the computer program. In this regard, static analysis tools are capable of analyzing all portions of the computer program since the analysis is not dependent upon execution of the computer program. In lieu of execution, static analysis tools utilize heuristics to analyze the computer program. The heuristics, while attempting to approximate runtime behavior, cannot precisely model true runtime behavior. As such, static analysis tools typically generate more false positives than runtime analysis.